package cn.datastruct.four;

/*
    总结：
        1，栈用数组比较好实现，思想比较简单，利用top上下移动来实现出栈和入栈
        2，学会了怎么抛出异常，而不是不处理异常，知道异常是怎么发出的
    date:2021/2/21/22:30
* */
/*  用数组实现栈：
        1，定义数组长度，数组，指向栈顶的地址的元素
        2，isEmpty(),判断是否栈空
        3，isFull(),判断是否栈满
        4，add(int a),添加元素
        5，pop(),出栈
        6,求栈长度
        7,求栈最大容量
        8,打印栈

* */
public class ArrayStack extends Stack {
    //1，定义数组长度，数组，指向栈顶的地址的元素
    private int maxSize;
    private int arr[];
    private int top;

    //构造器
    public ArrayStack(int maxSize) {
        this.maxSize = maxSize;
        this.arr = new int[this.maxSize];
        this.top = -1;
    }

    //2、isEmpty(),判断是否栈空
    @Override
    public boolean isEmpty() {
        return this.top == -1;
    }

    //3、isFull(),判断是否栈满
    @Override
    public boolean isFull() {
        return this.top == this.maxSize;
    }

    //4、add(int a),添加元素
    @Override
    public void push() {
    }

    ;

    public void push(int a) throws Exception {
        if (isFull())
            throw new Exception("栈已经满了，无法添加");
        this.top++;
        this.arr[this.top] = a;
    }

    //5、pop(),出栈
    @Override
    public void pop() {
        if (isEmpty())
            throw new RuntimeException("栈为空，出栈操作无法实现");
        this.top--;
    }

    //6、求栈长度
    @Override
    public int length() {
        return this.top + 1;
    }

    //7、求栈最大容量
    public int maxsize() {
        return this.maxSize;
    }

    //8、打印栈
    @Override
    public void showStack() {
        if (this.isEmpty())
            return;
        for (int i = 0; i <= this.top; i++) {
            System.out.println(this.arr[i]);
        }
    }
}
